package database;

/**
 * TypedAttribute.java
 * Cette classe modelise un attribut de table avec son type et ses parametres divers.
 * Herite de Attribute
 * @author Aubry Pirian
 * @version 0.6
 */
public class TypedAttribute extends Attribute {

	/**
	 * Attributs complementaires
	 */
	private String type;			// Type SQL de l'attribut
	private String length;			// Longueur/Valeur
	private String deflt;			// Valeur par defaut 
	private boolean notNull;		// NULL / NOT NULL
	private boolean autoIncrement;	// AUTO_INCREMENT
	// Cles
	private char key;				// Cle pour l'attribut
	final static char DEF_KEY = '-';					// si aucune cle n'est definie
	final static char[] KEYS = {'p','i','u',DEF_KEY};	// primary / index / unique / rien
	
	
	/**
	 * Constructeur de TypedAttribute, avec les parametres essentiels
	 * @param name		: nom de l'attribut
	 * @param type		: type de l'attribut
	 * @param length	: longueur / valeur
	 * @param deflt		: valeur par defaut
	 * @throws NoSuchFieldException : attribut non valide 
	 */
	public TypedAttribute(
		String name, String type, String length, String deflt
	) throws NoSuchFieldException {
		super(name);
		if ( type==null || type.length()==0 ) throw new NoSuchFieldException("Type non valide.");
		this.type=type;
		this.length=length;
		this.deflt=deflt;
		this.notNull=false;
		this.autoIncrement=false;
		this.key=DEF_KEY;
	}
	
	/**
	 * Constructeur de TypedAttribute, avec quelques parametres en plus
	 * @param name			: nom de l'attribut
	 * @param type			: type de l'attribut
	 * @param length		: longueur/valeur
	 * @param deflt			: valeur par defaut
	 * @param notNull		: NULL / NOT NULL
	 * @param autoIncrement	: auto_increment
	 * @throws NoSuchFieldException : attribut non valide
	 */
	public TypedAttribute(
		String name, String type, String length, String deflt,
		boolean notNull, boolean autoIncrement
	) throws NoSuchFieldException {
		super(name);
		if ( type==null || type.length()==0 ) throw new NoSuchFieldException("Type non valide.");
		this.type=type;
		this.length=length;
		this.deflt=deflt;
		this.notNull=notNull;
		this.autoIncrement=autoIncrement;
		this.key=DEF_KEY;
	}
	
	/**
	 * Constructeur de TypedAttribute, avec tous les parametres
	 * @param name			: nom de l'attribut
	 * @param type			: type de l'attribut
	 * @param length		: longueur/valeur
	 * @param deflt			: valeur par defaut
	 * @param notNull		: NULL / NOT NULL
	 * @param autoIncrement	: AUTO_INCREMENT
	 * @param key			: cle
	 * @throws NoSuchFieldException : attribut non valide
	 */
	public TypedAttribute (
		String name, String type, String length, String deflt,
		boolean notNull, boolean autoIncrement, char key
	) throws NoSuchFieldException {
		super(name);
		this.name = name;
		if ( type==null || type.length()==0 ) throw new NoSuchFieldException("Type non valide.");
		this.type=type;
		this.length=length;
		this.deflt=deflt;
		this.notNull=notNull;
		this.autoIncrement=autoIncrement;
		this.key=DEF_KEY;
		int kl = KEYS.length-1;
		while (kl>=0) {
			if (key == KEYS[kl]) this.key=key;
			kl--;
		}
	}
	
	/**
	 * Méthode getKey
	 * Retourne le nom de la clé
	 */
	public char getKey () { return this.key; }
	
	/**
	 * Méthode getAutoIncrement
	 * Retourne true si l'attribut est auto-incrémenté
	 */
	public boolean getAutoIncrement () { return this.autoIncrement;	}
	
	/**
	 * Afficheur de l'objet
	 * @return l'objet en chaîne de caractères
	 */
	public String toString() {
		String s = "";
		s += "`"+this.name+"` "+this.type.toUpperCase();
		if (!this.length.equals("")) s += "("+this.length+")";
		if (!this.deflt.equals("")) s += " DEFAULT '"+this.deflt+"'";
		if (this.notNull) s += " NOT NULL";
		if (this.autoIncrement) s += " auto_increment";
		/*
		switch (this.key) {
			case 'p': s += " PRIMARY KEY"; break;
			case 'i': s += " INDEX"; break;
			case 'u': s += " UNIQUE"; break;
		}
		*/
		return s;
	}
	
}